home *** CD-ROM | disk | FTP | other *** search
/ Dr. Windows 3 / dr win3.zip / dr win3 / PROGRAMR / UPC12BS1.ZIP / UUCICO / SUSPEND2.C < prev    next >
C/C++ Source or Header  |  1993-10-03  |  18KB  |  589 lines

  1. /*--------------------------------------------------------------------*/
  2. /*    s u s p e n d 2 . c                                             */
  3. /*                                                                    */
  4. /*    suspend/resume uupoll/uucico daemon (for OS/2)                  */
  5. /*                                                                    */
  6. /*    Author: Kai Uwe Rommel                                          */
  7. /*--------------------------------------------------------------------*/
  8.  
  9. /*--------------------------------------------------------------------*/
  10. /*       Copyright (c) 1993 by Kai Uwe Rommel                         */
  11. /*--------------------------------------------------------------------*/
  12.  
  13. /*--------------------------------------------------------------------*/
  14. /*       Changes Copyright (c) 1989-1993 by Kendra Electronic         */
  15. /*       Wonderworks.                                                 */
  16. /*                                                                    */
  17. /*       All rights reserved except those explicitly granted by       */
  18. /*       the UUPC/extended license agreement.                         */
  19. /*--------------------------------------------------------------------*/
  20.  
  21. /*--------------------------------------------------------------------*/
  22. /*                          RCS Information                           */
  23. /*--------------------------------------------------------------------*/
  24.  
  25. /*
  26.  *    $Id: suspend2.c 1.4 1993/10/03 20:37:34 ahd Exp $
  27.  *
  28.  *    Revision history:
  29.  *    $Log: suspend2.c $
  30.  * Revision 1.4  1993/10/03  20:37:34  ahd
  31.  * Further cleanup for 32 bit environment
  32.  *
  33.  * Revision 1.3  1993/09/30  03:06:28  ahd
  34.  * Move suspend signal handler into suspend2
  35.  *
  36.  * Revision 1.2  1993/09/29  04:49:20  ahd
  37.  * Various clean up, with additional messages to user
  38.  * Use unique signal handler
  39.  *
  40.  * Revision 1.1  1993/09/27  00:45:20  ahd
  41.  * Initial revision
  42.  *
  43.  */
  44.  
  45. /*
  46.  * This modules allows suspending/resuming a running "uucico -r0"
  47.  * from another process if this other process wants to make an outgoing
  48.  * call. This can be an outgoing uucico or any other application.
  49.  * An outgoing uucico can suspend the background one itself while
  50.  * other applications such as terminal emulators will require to
  51.  * be wrapped in a batch files with calls to the uuport utility.
  52.  *
  53.  * The communication between the uuport or outgoing uucico and the
  54.  * background uucico is done via a named pipe. This has the advantage
  55.  * that it also works across a network between two machines if the
  56.  * background uucico runs on a LAN server which makes the modem shareable
  57.  * to other OS/2 machines. Then another machine first suspends the uucico
  58.  * on the server using a named pipe over the network and then requests
  59.  * the modem with a "NET USE" or equivalent operation. After using and
  60.  * disconnecting from the server's modem, it can resume the uucico on
  61.  * the server, again via network pipe.
  62.  */
  63.  
  64. /*--------------------------------------------------------------------*/
  65. /*       Note that the 32 bit API doesn't handle signals like it's    */
  66. /*       16 bit older cousin.  For now, we support the client of      */
  67. /*       the of the pipe to suspend a 16 bit UUCICO, but a 32 bit     */
  68. /*       UUCICO cannot be suspended.                                  */
  69. /*--------------------------------------------------------------------*/
  70.  
  71. /*--------------------------------------------------------------------*/
  72. /*                        System include files                        */
  73. /*--------------------------------------------------------------------*/
  74.  
  75. #include <stdio.h>
  76. #include <stdlib.h>
  77. #include <string.h>
  78. #include <sys/types.h>
  79. #include <limits.h>
  80. #include <signal.h>
  81. #include <process.h>
  82.  
  83. #define INCL_DOS
  84. #define INCL_DOSPROCESS
  85. #define INCL_ERRORS
  86. #define INCL_DOSSIGNALS
  87. #include <os2.h>
  88.  
  89. /*--------------------------------------------------------------------*/
  90. /*                    UUPC/extended include files                     */
  91. /*--------------------------------------------------------------------*/
  92.  
  93. #include "lib.h"
  94. #include "hostable.h"
  95. #include "security.h"
  96. #include "dcp.h"
  97. #include "dcpsys.h"
  98. #include "safeio.h"
  99. #include "modem.h"
  100. #include "catcher.h"
  101. #include "pos2err.h"
  102. #include "suspend.h"
  103. #include "usrcatch.h"
  104.  
  105. #define STACKSIZE 8192
  106.  
  107. boolean suspend_processing = FALSE;
  108.  
  109. /* This module creates a new thread. Because this thread has a stack
  110.  * segment different from the DGROUP (unlike the main thread) this
  111.  * normally requires compilation with different options. To avoid this
  112.  * (possible because the thread does not use any library routines),
  113.  * we take care not to access any local (stack) variables but only
  114.  * static global variables. There are chances that even accessing stack
  115.  * variables would work (if BP is used) but that can't be ensured.
  116.  * The same is done (to be on the safe side) for the system signal handler.
  117.  */
  118.  
  119. static HPIPE hPipe;
  120. static char nChar;
  121. static char *portName;
  122.  
  123. #ifdef __OS2__
  124.  
  125. static HEV semWait, semFree;
  126. static ULONG postCount;
  127. static ULONG nBytes;
  128.  
  129. #else
  130.  
  131. static ULONG semWait, semFree;
  132. static PFNSIGHANDLER old;
  133. static USHORT nAction;
  134. static int nBytes;
  135. typedef USHORT APIRET ;  // Define older API return type
  136.  
  137. #endif
  138.  
  139. currentfile();
  140.  
  141. #ifdef __TURBOC__
  142. #pragma -N-
  143. #else
  144. #pragma check_stack( off )
  145. #endif
  146.  
  147. #ifndef __OS2__
  148.  
  149. /*--------------------------------------------------------------------*/
  150. /*       S u s p e n d T h r e a d                                    */
  151. /*                                                                    */
  152. /*       Accept request to release serial port                        */
  153. /*--------------------------------------------------------------------*/
  154.  
  155. static VOID FAR SuspendThread(VOID)
  156. {
  157.  
  158.  
  159. /*--------------------------------------------------------------------*/
  160. /*       Process until we get a request to change the status of       */
  161. /*       the port.                                                    */
  162. /*--------------------------------------------------------------------*/
  163.  
  164.   for (;;)
  165.   {
  166.  
  167. #ifdef __OS2__
  168.     if ( DosConnectNPipe(hPipe) )
  169.       break;
  170. #else
  171.     if ( DosConnectNmPipe(hPipe) )
  172.       break;
  173. #endif
  174.  
  175.     for (;;)
  176.     {
  177.       if ( DosRead(hPipe, &nChar, 1, &nBytes) )
  178.         break;                   // Quit if an error
  179.  
  180.       if ( nBytes == 0 )
  181.         break; /* EOF */
  182.  
  183. /*--------------------------------------------------------------------*/
  184. /*               Handle the received command character                */
  185. /*--------------------------------------------------------------------*/
  186.  
  187.       switch ( nChar )
  188.       {
  189.  
  190.         case 'Q': /* query */
  191.  
  192.           nChar = (char) (suspend_processing ? 'S' : 'R');
  193.           DosWrite(hPipe, &nChar, 1, &nBytes);
  194.  
  195.           break;
  196.  
  197.         case 'S': /* suspend */
  198.  
  199.           if ( suspend_processing ||
  200.                interactive_processing ||
  201.                terminate_processing )
  202.           {
  203.             nChar = 'E';
  204.           }
  205.           else {
  206.             suspend_processing = TRUE;
  207.  
  208. #ifdef __OS2__
  209.             raise(SIGUSR1);
  210.             nChar = (char) (DosWaitEventSem(&semFree, 20000) ? 'T' : 'O');
  211. #else
  212.             DosFlagProcess(getpid(), FLGP_PID, PFLG_A, 0);
  213.             nChar = (char) (DosSemSetWait(&semFree, 20000) ? 'T' : 'O');
  214. #endif
  215.           } /* else */
  216.  
  217.           DosWrite(hPipe, &nChar, 1, &nBytes);
  218.  
  219.           break;
  220.  
  221.         case 'R': /* release */
  222.  
  223.           if ( !suspend_processing )
  224.             nChar = 'E';
  225.           else {
  226.             suspend_processing = FALSE;
  227.  
  228. #ifdef __OS2__
  229.             DosResetEventSem( &semWait, &postCount );
  230. #else
  231.             DosSemClear(&semWait);
  232. #endif
  233.             nChar = 'O';
  234.  
  235.           } /* else */
  236.  
  237.           DosWrite(hPipe, &nChar, 1, &nBytes);
  238.  
  239.           break;
  240.  
  241.         default:
  242.  
  243.           nChar = 'U';
  244.           DosWrite(hPipe, &nChar, 1, &nBytes);
  245.  
  246.           break;
  247.  
  248.       } /* switch */
  249.  
  250.     } /* for (;;) */
  251.  
  252. /*-----